package pers.lmd.common.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * @Author lmd
 * @Date 2023/5/1 12:56
 */
@Component
public class FileCustomUtil {

    /**
     * 上传头像
     * @param file
     * @throws IOException
     */
    public void uploadAvatar(MultipartFile file) throws IOException {
        // 获取文件名
        String originalFilename = file.getOriginalFilename();
        // 生成 uuid
        String uuid = IdUtil.fastSimpleUUID();
        // 获取存储路径
        String rootFilepath = System.getProperty("user.dir") + "/src/main/resources/files/avatar/" + uuid + "_" + originalFilename;
        // 写入
        FileUtil.writeBytes(file.getBytes(), rootFilepath);
    }

    /**
     * 上传文章图片
     *
     * @param file 文件
     * @return articleName 文章图片名
     * @throws IOException
     */
    public String uploadArticle(MultipartFile file) throws IOException {
        // 获取文件名
        String originalFilename = file.getOriginalFilename();
        // 生成 uuid
        String uuid = IdUtil.fastSimpleUUID();
        // 文件名拼接
        String articleImage = uuid+'_'+originalFilename;
        // 获取存储路径
        String rootFilepath = System.getProperty("user.dir") + "/src/main/resources/files/avatar/" + articleImage;
        // 写入
        FileUtil.writeBytes(file.getBytes(), rootFilepath);
        return articleImage;
    }

    /**
     * 获取头像
     * @param response
     * @param flag
     */
    public void getAvatar(HttpServletResponse response, String flag) {
        // 新建一个输出流对象
        OutputStream outputStream;
        // 获取头像资源路径
        String avatarPath = System.getProperty("user.dir") + "/src/main/resources/files/avatar/";
        // 获取所有文件名
        List<String> fileName = FileUtil.listFileNames(avatarPath);
        // 筛选用户头像
        String avatar = fileName.stream().filter(name -> name.contains(flag)).findAny().orElse("");
        try {
            if (StrUtil.isNotEmpty(avatar)) {
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(avatar, "UTF-8"));
                response.setContentType("application/octet-stream");
                // 通过文件路径，读取文件字节流
                byte[] bytes = FileUtil.readBytes(avatarPath + avatar);
                // 通过输出流，返回文件 （还有另一种方式，返回资源路径，但有安全隐患，会暴露文件在服务器中的真实地址）
                outputStream = response.getOutputStream();
                outputStream.write(bytes);
                outputStream.flush();
                outputStream.close();
            }
        } catch (Exception e) {
            System.out.println("文件下载失败");
        }
    }

    /**
     * 获取照片
     * @param response
     * @param flag
     */
    public void getPicture(HttpServletResponse response, String flag) {
        // 新建一个输出流对象
        OutputStream outputStream;
        // 获取头像资源路径
        String picturePath = System.getProperty("user.dir") + "/src/main/resources/files/picture/";
        // 获取所有文件名
        List<String> fileName = FileUtil.listFileNames(picturePath);
        // 筛选用户头像
        String picture = fileName.stream().filter(name -> name.contains(flag)).findAny().orElse("");
        try {
            if (StrUtil.isNotEmpty(picture)) {
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(picture, "UTF-8"));
                response.setContentType("application/octet-stream");
                // 通过文件路径，读取文件字节流
                byte[] bytes = FileUtil.readBytes(picturePath + picture);
                // 通过输出流，返回文件 （还有另一种方式，返回资源路径，但有安全隐患，会暴露文件在服务器中的真实地址）
                outputStream = response.getOutputStream();
                outputStream.write(bytes);
                outputStream.flush();
                outputStream.close();
            }
        } catch (Exception e) {
            System.out.println("文件下载失败");
        }
    }
}
